﻿using BookStore.Solution.Entities;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace BookStore.Solution.BLL
{
    public class PublisherManager
    {
        private string result = "";
        private DataTable generateTable()
        {
            DataTable dtPublisher = new DataTable();
            dtPublisher.Columns.Add("PublisherID", typeof(string));
            dtPublisher.Columns.Add("PublisherName", typeof(string));
            dtPublisher.Columns.Add("Address", typeof(string));
            dtPublisher.Columns.Add("Email", typeof(string));
            dtPublisher.Columns.Add("PhoneNumber", typeof(string));
            dtPublisher.Columns.Add("Website", typeof(string));
            return dtPublisher;
        }
        public string Insert(Publisher publisher)
        {
            using (var context = new BookStoreEntities())
            {
                int numOfRows = context.Publishers.Where(p => p.PublisherID == publisher.PublisherID).Count();
                if (numOfRows == 0)
                {
                    context.Publishers.Add(publisher);
                    if (context.SaveChanges() > 0)
                    {
                        SystemLogManager.Insert("Thêm nhà xuất bản: " + publisher);
                        result = "Thêm thành công";
                    }
                    else
                        result = "Thêm thất bại";
                }
                else
                {
                    result = "Mã NXB đã tồn tại trong hệ thống. Vui lòng chọn mã NXB khác.";
                }

            }
            return result;
        }
        public string Update(Publisher publisher)
        {
            using (var context = new BookStoreEntities())
            {
                Publisher pub = (from p in context.Publishers
                                 where p.PublisherID == publisher.PublisherID
                                 select p).First();
                pub.PublisherName = publisher.PublisherName;
                pub.Address = publisher.Address;
                pub.Email = publisher.Email;
                pub.PhoneNumber = publisher.PhoneNumber;
                pub.Website = publisher.Website;
                if (context.SaveChanges() > 0)
                {
                    SystemLogManager.Insert("Cập nhật nhà xuất bản: " + publisher);
                    result = "Cập nhật thông tin NXB thành công";
                }
                else
                    result = "Cập nhật thông tin NXB thất bại";
            }
            return result;
        }
        public string Delete(string publisherID)
        {
            using (var context = new BookStoreEntities())
            {
                Product book = context.Products.Where(p => p.PublisherID == publisherID).FirstOrDefault<Product>();
                if (book == null)
                {
                    Publisher publisher = (from p in context.Publishers
                                           where p.PublisherID == publisherID
                                           select p).First();
                    if (publisher != null)
                    {
                        publisher.Status = "Đã xóa";
                        if (context.SaveChanges() > 0)
                        {
                            SystemLogManager.Insert("Xóa nhà xuất bản: " + publisher);
                            result = "Xóa thông tin NXB thành công";
                        }
                        else
                            result = "Xóa thông tin NXB thất bại";
                    }
                }
                else
                    result = "NXB này đang được sử dụng cho một hoặc nhiều sách khác trong hệ thống";
            }
            return result;
        }
        public DataTable SearchbyID(string pubID)
        {
            DataTable dtPublisher = generateTable();
            using (var context = new BookStoreEntities())
            {
                var listPublisher = from p in context.Publishers where p.PublisherID == pubID && p.Status == "Khả dụng" select p;
                foreach (var row in listPublisher)
                {
                    dtPublisher.LoadDataRow(new object[] { row.PublisherID, row.PublisherName, row.Address, row.Email, row.PhoneNumber, row.Website }, false);
                }
            }
            return dtPublisher;
        }
        public DataTable SearchbyName(string pubName)
        {
            DataTable dtPublisher = generateTable();
            using (var context = new BookStoreEntities())
            {
                var listPublisher = from p in context.Publishers where p.PublisherName.Contains(pubName) && p.Status == "Khả dụng" select p;
                foreach (var row in listPublisher)
                {
                    dtPublisher.LoadDataRow(new object[] { row.PublisherID, row.PublisherName, row.Address, row.Email, row.PhoneNumber, row.Website }, false);
                }
            }
            return dtPublisher;
        }
        public DataTable GetAll()
        {
            DataTable dtPublisher = generateTable();
            using (var context = new BookStoreEntities())
            {
                var listPublisher = from p in context.Publishers where p.Status == "Khả dụng" select p;
                foreach (var row in listPublisher)
                {
                    dtPublisher.LoadDataRow(new object[] { row.PublisherID, row.PublisherName, row.Address, row.Email, row.PhoneNumber, row.Website }, false);
                }
            }
            return dtPublisher;
        }

        public Publisher GetDetail(string pubID)
        {
            Publisher publisher = null;
            using (var context = new BookStoreEntities())
            {
                try
                {
                    publisher = context.Publishers.Where(p => p.PublisherID == pubID).FirstOrDefault<Publisher>();
                }
                catch (Exception e)
                {
                    throw e;
                }
            }
            return publisher;
        }
    }
}
